/*******************************************************************************
 * Copyright (c) 2008, 2009 Fabio Mauro - Alberto Terraneo.
 * Permission is granted to copy, distribute and/or modify this document
 * under the terms of the GNU Free Documentation License, Version 1.2
 * or any later version published by the Free Software Foundation.
 *     
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied 
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 * See the GNU Free Documentation License for more details.
 *     
 * You should have received a copy of the GNU Free Documentation 
 * License along with this distribution; if not, send a email to authors:
 * aterraneo <at> users.sourceforge.net
 * bigmoby09 <at> users.sourceforge.net
 *******************************************************************************/
package it.blueocean.acanto.model;

import it.blueocean.acanto.model.common.ABaseEntity;
import it.blueocean.acanto.model.constants.StatoProdotto;
import it.blueocean.acanto.model.constants.TipoIva;
import it.blueocean.acanto.model.constants.TipoUnitaDiMisura;

import java.io.Serializable;
import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.ForeignKey;

@Entity
@Table(name = "TA_PRODOTTI")
public class Prodotto extends ABaseEntity implements IAcantoEntity, Serializable
{
	private static final long serialVersionUID = -3061283489596747405L;

	@Id
	@Column(name = "ID_PRODOTTO", unique = true, nullable = false)
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long id;
	
	@Column(name = "CODICE_PRODOTTO", unique = true)
	private String codiceProdotto;

	@Column(name = "PREZZO_UNITARIO")
	private BigDecimal prezzoUnitario = new BigDecimal("0.00");
	
	@Column(name = "SCONTO_PERCENTUALE")
	private double scontoPercentuale;

	@Column(name = "ALIQUOTA_IVA", columnDefinition = "CHAR(30)")
	@Enumerated(EnumType.STRING)
	private TipoIva aliquotaIva = null;

	@Column(name = "UNITA_DI_MISURA", columnDefinition = "CHAR(30)")
	@Enumerated(EnumType.STRING)
	private TipoUnitaDiMisura unitaMisura = null;

	@Column(name = "DESCRIZIONE")
	private String descrizione = null;

	@Column(name = "NOTE")
	private String note = null;
	
	@Column(name = "STATUS", columnDefinition = "CHAR(30)")
    @Enumerated(EnumType.STRING)
    private StatoProdotto status = null;
	
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_LISTINO")
    @ForeignKey(name = "FK_PRODOTTO_LISTINO")
    private Listino listino;
	
	public Prodotto() {}
	
	@Override
	public String toString()
	{
		return new StringBuffer()
		.append("id : " + this.getId()).append("\n")
		.append("prezzoUnitario : " + this.getPrezzoUnitario()).append("\n")
		.append("aliquotaIva : " + this.getAliquotaIva()).append("\n")
		.append("unitaDiMisura : " + this.getUnitaMisura()).append("\n")
		.append("descrizione : " + this.getDescrizione()).append("\n")
		.append("note : " + this.getNote()).append("\n")
		.toString();
	}
	
	@Override
	public boolean equals(Object obj)
	{
        if (obj instanceof Prodotto)
        {
        	Prodotto p = (Prodotto) obj;
            return p.getId()== this.getId() && 
            p.getAliquotaIva().equals(this.getAliquotaIva()) && 
            p.getUnitaMisura().equals(this.getUnitaMisura()) && 
            p.getDescrizione().equals(this.getDescrizione()) && 
            p.getNote().equals(this.getNote()) && 
            p.getPrezzoUnitario().equals(this.getPrezzoUnitario());
        }
        else
            return false;        	
	}
	
	@Override
	public int hashCode()
	{
		final int prime = 31;
		int result = (int) id;
		result = prime * result + ((aliquotaIva == null) ? 0 : aliquotaIva.hashCode());
		result = prime * result + ((codiceProdotto == null) ? 0 : codiceProdotto.hashCode());
		result = prime * result + ((descrizione == null) ? 0 : descrizione.hashCode());
		result = prime * result + ((note == null) ? 0 : note.hashCode());
		result = prime * result + ((prezzoUnitario == null) ? 0 : prezzoUnitario.hashCode());
		result = prime * result + ((unitaMisura == null) ? 0 : unitaMisura.hashCode());
		return result;
	}
	
	@Override
	public Prodotto clone()
	{
		Prodotto clone = new Prodotto();
		
		clone.setId(this.getId());
		clone.setCodiceProdotto(this.getCodiceProdotto());
		clone.setAliquotaIva(this.getAliquotaIva());
		clone.setUnitaMisura(this.getUnitaMisura());
		clone.setDescrizione(this.getDescrizione());
		clone.setNote(this.getNote());
		clone.setPrezzoUnitario(this.getPrezzoUnitario());
				
		return clone;
	}

	public String getDescrizione()
	{
		return descrizione;
	}

	public void setDescrizione(String descrizione)
	{
		this.descrizione = descrizione;
	}

	public TipoIva getAliquotaIva()
	{
		return aliquotaIva;
	}

	public void setAliquotaIva(TipoIva aliquotaIva)
	{
		this.aliquotaIva = aliquotaIva;
	}

	public String getNote()
	{
		return note;
	}

	public void setNote(String note)
	{
		this.note = note;
	}

	public BigDecimal getPrezzoUnitario()
	{
		return prezzoUnitario;
	}

	public void setPrezzoUnitario(BigDecimal prezzoUnitario)
	{
		this.prezzoUnitario = prezzoUnitario;
	}

	public long getId()
    {
        return id;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    public double getScontoPercentuale()
    {
        return scontoPercentuale;
    }

    public void setScontoPercentuale(double scontoPercentuale)
    {
        this.scontoPercentuale = scontoPercentuale;
    }

    public StatoProdotto getStatus()
    {
        return status;
    }

    public void setStatus(StatoProdotto status)
    {
        this.status = status;
    }

    public TipoUnitaDiMisura getUnitaMisura()
	{
		return unitaMisura;
	}

	public void setUnitaMisura(TipoUnitaDiMisura unitaMisura)
	{
		this.unitaMisura = unitaMisura;
	}

	public String getCodiceProdotto() {
		return codiceProdotto;
	}

	public void setCodiceProdotto(String codiceProdotto) {
		this.codiceProdotto = codiceProdotto;
	}

    public Listino getListino()
    {
        return listino;
    }

    public void setListino(Listino listino)
    {
        this.listino = listino;
    }
	
}
